package com.xjc.system.utils;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Base64;
import java.util.List;

/**
 * 徐锦程
 * 时间:2024-10-01 11:13
 * 描述:文本转换为Base64编码的图片
 */
public class TextToBase64Util {

    /**
     * 将文本转换为Base64编码的图片
     *
     * @param text         文本内容
     * @param textColor    文本颜色
     * @param backgroundColor 背景颜色
     * @param fontSize     字体大小
     * @param maxWidth     最大宽度
     * @param maxHeight    最大高度
     * @param lineHeight   行高
     * @return Base64编码的图片数据
     */
    public static String textToBase64Image(String text, Color textColor, Color backgroundColor, int fontSize, int maxWidth, int maxHeight, int lineHeight) {
        // 创建一个空白图像
        BufferedImage image = new BufferedImage(maxWidth, maxHeight, BufferedImage.TYPE_INT_RGB);

        // 获取图形上下文
        Graphics2D g = image.createGraphics();

        // 设置背景颜色
        g.setColor(backgroundColor);
        g.fillRect(0, 0, maxWidth, maxHeight);

        // 设置字体样式
        Font font = new Font("宋体", Font.PLAIN, fontSize);
        g.setFont(font);

        // 设置文本颜色
        g.setColor(textColor);

        // 分割文本为多行
        String[] lines = splitTextIntoLines(text, maxWidth, font, g);

        // 计算文本的高度
        int y = lineHeight / 2;

        // 绘制每行文本
        for (String line : lines) {
            int x = (maxWidth - g.getFontMetrics().stringWidth(line)) / 2;
            g.drawString(line, x, y);
            y += lineHeight;
        }

        // 释放资源
        g.dispose();

        // 将图像转换为Base64编码
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        try {
            ImageIO.write(image, "png", baos);
            byte[] imageBytes = baos.toByteArray();
            return "data:image/png;base64," + new String(Base64.getEncoder().encode(imageBytes));
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 将文本分割成多行
     *
     * @param text    文本内容
     * @param width   图片宽度
     * @param font    字体
     * @param g       Graphics2D对象
     * @return 分割后的文本数组
     */
    private static String[] splitTextIntoLines(String text, int width, Font font, Graphics2D g) {
        FontMetrics metrics = g.getFontMetrics(font);
        String[] words = text.split(" ");
        StringBuilder line = new StringBuilder();
        List<String> lines = new ArrayList<>();

        for (String word : words) {
            String testLine = line.toString() + word + " ";
            int testWidth = metrics.stringWidth(testLine);

            if (testWidth <= width) {
                line.append(word).append(" ");
            } else {
                lines.add(line.toString().trim());
                line = new StringBuilder(word + " ");
            }
        }

        if (line.length() > 0) {
            lines.add(line.toString().trim());
        }

        return lines.toArray(new String[0]);
    }

}
